package doc;

public class Demo01 {
    public static void main(String[] args) {
        int n =50;//编译器自动翻译成二进制：110010，并且在运行的期间一直是110010
        System.out.println(Integer.toBinaryString(n));
        //n是int型，要输出n，110010会转换成int型
        System.out.println(n);

        for(int i=0;i<=10;i++){
            System.out.println(Integer.toBinaryString(i));
            //int类型是32位数：32位二进制
            //1=00000000 00000000 00000000 00000001
        }
        int m = 0b111001;
        System.out.println(m);//57
        int l = 00001_00001001;//可以用下划线分段
        System.out.println(l);

        int x = -3;
        System.out.println(Integer.toBinaryString(x));//11111111111111111111111111111101  补码
        /*
        补码是计算机中用于处理负数的一种编码规则，其编码思路是将固定位数的二进制数分一半作为负数使用
        *固定位数：采用固定长度的二进制数表示数字，如果int类型就是固定32位长度的，计算时任何计算结果如果超过固定位数，就自动舍弃多出的位
        *假定byte固定八位数,那么从00000000到01111111（即0到127）为正，111111111到10000000（即-128到-1）为负
        *计算机真正操作时，是32位补码
        */

        int max = Integer.MAX_VALUE;
        int min = Integer.MIN_VALUE;
        System.out.println(Integer.toBinaryString(max));//01111111 11111111 11111111 11111111
        System.out.println(Integer.toBinaryString(min));//10000000 00000000 00000000 00000000
        System.out.println(Integer.toBinaryString(max+1));//最大值加1得到最小值
        int y = -1;
        System.out.println(Integer.toBinaryString(y));//11111111 11111111 11111111 11111111
        /*
        二进制转负数
        11101011=-1-4-16=-21   从最后一位开始，-1减去每个有0的位数代表的权数  倒数第一权数为1，倒数第三个为零则减去4
         */
        /*
        补码互补对称：-n=~n+1。~n为n的取反，即对应的位数0取反得1，1取反得2
         */
        System.out.println(~100+1);//-100
        System.out.println(~-100+1);//100
        System.out.println(~100);//-101
        System.out.println(~-100);//99

        /*
        基本运算规则
        &：逻辑乘法，逢0则0
         */
        int a = 0x6e188fd5;    //01101110 00011000 10001111 11010101
        int b = 0xff;          //00000000 00000000 00000000 11111111
        System.out.println(Integer.toBinaryString(a&b));//11010101   当我们需要某一段代码 但不需要其他位时，可以用&
        int k = a>>>8;//逻辑右移位计算
        System.out.println(Integer.toBinaryString(k));
        //00000000 01101110 00011000 10001111,往右移动八位，空出来的用0补位，右边多余的切掉





        /*
        16进制：计算机行业采用16进制作为2进制的缩写！
        每四位二进制缩写成一个十六进制的一位
        二进制前缀是0b，十六进制前缀是0x

         */
    }
}
